const fs = require('fs');
const path = require('path');
const { app } = require('electron');

// 使用用户数据目录
const userDataPath = app ? app.getPath('userData') : process.env.APPDATA;
const logDir = path.join(userDataPath, 'logs');

// 确保日志目录存在
if (!fs.existsSync(logDir)) {
    fs.mkdirSync(logDir, { recursive: true });
}

// 创建写入流 - 分别创建错误日志和普通日志文件
const errorLogStream = fs.createWriteStream(
    path.join(logDir, 'error.log'),
    { flags: 'a' }
);

const infoLogStream = fs.createWriteStream(
    path.join(logDir, 'info.log'),
    { flags: 'a' }
);

// 日志级别
const LOG_LEVELS = {
    ERROR: 'ERROR',
    WARN: 'WARN',
    INFO: 'INFO', 
    DEBUG: 'DEBUG'
};

// 当前日志级别
const currentLogLevel = process.env.LOG_LEVEL || LOG_LEVELS.INFO;

// 格式化日志消息
function formatLogMessage(level, ...args) {
    // 获取当前时间并转换为北京时间
    const now = new Date();
    // 获取本地时间字符串（包含时区信息）
    const beijingTime = now.toLocaleString('zh-CN', { 
        timeZone: 'Asia/Shanghai',
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        hour12: false
    }).replace(/\//g, '-');
    
    const message = args.map(arg => 
        arg instanceof Error ? 
            `${arg.message}\n${arg.stack}` : 
            typeof arg === 'object' ? 
                JSON.stringify(arg, null, 2) : 
                String(arg)
    ).join(' ');
    
    return `[${beijingTime}] [${level}] ${message}\n`;
}

// 重写 console.error
const originalConsoleError = console.error;
console.error = (...args) => {
    // 保持原有的控制台输出
    originalConsoleError.apply(console, args);
    // 写入日志文件
    errorLogStream.write(formatLogMessage(LOG_LEVELS.ERROR, ...args));
};

// 添加 console.info
const originalConsoleInfo = console.info;
console.info = (...args) => {
    // 保持原有的控制台输出
    originalConsoleInfo.apply(console, args);
    // 写入日志文件
    infoLogStream.write(formatLogMessage(LOG_LEVELS.INFO, ...args));
};

// 添加 console.warn
const originalConsoleWarn = console.warn;
console.warn = (...args) => {
    // 保持原有的控制台输出
    originalConsoleWarn.apply(console, args);
    // 写入日志文件
    errorLogStream.write(formatLogMessage(LOG_LEVELS.WARN, ...args));
};

// 添加 console.debug
const originalConsoleDebug = console.debug;
console.debug = (...args) => {
    // 仅在调试级别时输出
    if (currentLogLevel === LOG_LEVELS.DEBUG) {
        // 保持原有的控制台输出
        originalConsoleDebug.apply(console, args);
        // 写入日志文件
        infoLogStream.write(formatLogMessage(LOG_LEVELS.DEBUG, ...args));
    }
};

// 确保在进程退出时关闭写入流
process.on('exit', () => {
    errorLogStream.end();
    infoLogStream.end();
});

// 导出 logger 接口以保持兼容性
module.exports = {
    error: (...args) => {
        console.error(...args);
    },
    warn: (...args) => {
        console.warn(...args);
    },
    info: (...args) => {
        console.info(...args);
    },
    debug: (...args) => {
        console.debug(...args);
    },
    log: (...args) => {
        console.info(...args); // log 别名为 info
    }
};
